
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="Parsley, the ultimate frontend javascript form validation library">
    <meta name="author" content="Guillaume Potier">

    <title>Parsley - Examples | Custom validator</title>

    <!-- Bootstrap core CSS -->
    <link href="../../bower_components/bootstrap/dist/css/bootstrap.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="../assets/docs.css" rel="stylesheet">

    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
      <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
    <![endif]-->

    <link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/styles/github.min.css" rel="stylesheet">

    <link href="../../src/parsley.css" rel="stylesheet">
  </head>

  <body class="examples">

    <div class="container">

      <div class="masthead">
        <div class="header">
          <h3 class="text-muted"><a href="../../">Parsley</a></h3>

          <span class="social-buttons inline-block">
            <a href="https://twitter.com/share" class="twitter-share-button" data-url="http://parsleyjs.org" data-text="Parsley, the ultimate javascript form validation library. #parsleyjs" data-via="guillaumepotier" data-related="guillaumepotier" data-hashtags="parsleyjs">Tweet</a>
            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>

            <iframe src="http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=watch&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="110" height="20"></iframe>

            <iframe src="http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=fork&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="110" height="20"></iframe>
          </span>
        </div>
      </div>

      <ul class="nav nav-justified">
        <li><a href="../../">Home</a></li>
        <li class="active"><a href="../examples.html">Examples</a></li>
        <li><a href="../index.html">Documentation</a></li>
        <li><a href="../download.html">Download</a></li>
        <li><a href="../help.html">Help</a></li>
        <li><a href="../annotated-source/main.html">Annotated&nbsp;source</a></li>
        <li><a href="../tests.html">Tests</a></li>
      </ul>

      <div class="row">

      <!-- ###################### BEGINNING OF EXAMPLE ######################-->

        <div class="col-md-4">
          <h2>Craft your own validators demo</h2>
          <small class="pull-left"><a href="../examples.html">&lt;&lt; Back to examples</a>
          — <a href="#" class="play">Try it on CodePen</a>
          </small>
          <span class="clearfix"></span>

          <hr>
          <div class="form-group example">
<form id="demo-form" data-parsley-validate>
  <label for="question">Please enter a palindrome:</label>
  <input type="text" class="form-control" name="s" required data-parsley-palindrome>

  <label for="question">Please enter a multiple of 3:</label>
  <input type="text" class="form-control" name="nb" required data-parsley-multiple-of="3">

  <label for="question">Please provide a file smaller than 42Kb:</label>
  <input type="file" name="f" required data-parsley-max-file-size="42">

  <input type="submit" class="btn btn-default pull-right" />
</form>
          </div>
        </div>
        <div class="col-md-8">
          <div class="code-block">
<pre><code class="example"></code></pre>
          </div>
        </div>
      </div>

      <!-- ###################### END OF EXAMPLE ######################-->

      <!-- Site footer -->
      <div class="footer">
        <p>&copy; <a href="https://twitter.com/guillaumepotier" title="Guillaume Potier on Twitter">Guillaume Potier</a> 2014 - <a href="http://wisembly.com">@Wisembly</a></p>
      </div>
    </div>

    <script src="../../bower_components/jquery/dist/jquery.min.js"></script>
    <script src="../../bower_components/bootstrap/js/affix.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/highlight.min.js"></script>

    <script src="../../dist/parsley.js"></script>

    <script class="example">
window.Parsley.addValidator('palindrome', {
  validateString: function(value) {
    return value.split('').reverse().join('') === value;
  },
  messages: {
    en: 'This string is not the reverse of itself',
    fr: "Cette valeur n'est pas l'inverse d'elle même."
  }
});

window.Parsley.addValidator('multipleOf', {
  validateNumber: function(value, requirement) {
    return value % requirement === 0;
  },
  requirementType: 'integer',
  messages: {
    en: 'This value should be a multiple of %s.',
    fr: "Ce nombre n'est pas un multiple de %s."
  }
});

window.Parsley.addValidator('maxFileSize', {
  validateString: function(_value, maxSize, parsleyInstance) {
    if (!window.FormData) {
      alert('You are making all developpers in the world cringe. Upgrade your browser!');
      return true;
    }
    var files = parsleyInstance.$element[0].files;
    return files.length != 1  || files[0].size <= maxSize * 1024;
  },
  requirementType: 'integer',
  messages: {
    en: 'This file should not be larger than %s Kb',
    fr: 'Ce fichier est plus grand que %s Kb.'
  }
});

    </script>
    <script src="../assets/example.js"></script>
  </body>
</html>
